"""
四、私有属性和私有函数
在python中，可以为属性和函数设置私有权限，即设置某个属性或函数不继承给子类。
甚至，不能在类的外部调用和访问

设置私有权限的方法：
在属性名和函数名 前面加上两个下划线__

如果也想要别人去访问和修改私有属性，在python中，一般定义函数名 get_xx用来获取私有属性，定义set_xx用来修改私有属性值
"""


class Animal(object):
    __name = '动物'  # 私有的属性（类属性）

    def __init__(self, color):
        self.__color = color  # 私有属性（对象属性）

    def __run(self):  # 私有函数
        print(self.__name)  # 在类里面可以访问私有属性
        print('动物跑起来')

    def say(self):  # 普通函数
        print('动物喊叫')
        print(f'颜色：{self.__color}')
        self.__run()  # 在类里面可以访问私有函数

    def set_color(self, new_color):  # 通过set_xx函数修改私有属性
        self.__color = new_color

    def get_color(self):  # 通过get_xx函数获取私有属性
        return self.__color


class Dog(Animal):
    pass


d1 = Dog('red')
# d1.__run()   # 'Dog' object has no attribute '__run'
d1.say()

# print(d1.__name)    # 'Dog' object has no attribute '__name'
# print(Animal.__name)    # type object 'Animal' has no attribute '__name'

d1.set_color("green")
d1.say()

print(d1.get_color())
